//
// Created by LiuYou on 2021/10/20.
//

#include <iostream>
#include <unistd.h>
#include <cstring>


static const int LEFT = 30000000;
static const int RIGHT = 30000200;

/**
 * @brief
 * @details 用 201 个子进程来计算这 201 个待计算的任务。
 * 那就是每次产生一个待计算的 i 值, 我就马上 fork(); 把这个 i 扔给子进程。
 *
 * <p>当前这个版本在Ubuntu上测试结果是: CPU的两个核同时飙升, 但是最高值为 40% 到 60% 之间。
 * 没有像上一个版本那样, 直接飙满CPU的一个核。
 *
 * <p> shell: ps axf

    150308 pts/1    S      0:00  \_ ./a.out
    150309 pts/1    S      0:00  \_ ./a.out
    150310 pts/1    S      0:00  \_ ./a.out
    150311 pts/1    S      0:00  \_ ./a.out
    150312 pts/1    S      0:00  \_ ./a.out
    150313 pts/1    S      0:00  \_ ./a.out
    150314 pts/1    S      0:00  \_ ./a.out
    150315 pts/1    S      0:00  \_ ./a.out

 * <p>如果当前进程是像上面那样写( \_ ./a.out )的话, 那就表明当前进程的父进程是 init 进程。
 *
 * @param argc
 * @param argv
 * @return
 */
int main(int argc, char** argv) {
    int mark{};
    for (int i = LEFT; i < RIGHT; ++i) {

        pid_t pid = fork();
        if (pid < 0) {
            perror( "fork()" );
            exit( 1 );
        }
        if (pid == 0) {
            mark = 1;
            for (int j = 2; j < i / 2; ++j) {
                if (i % j == 0) {
                    mark = 0;
                    break;
                }
            }
            if (mark == 1) {
                printf( "%d 是一个质数。\n", i );
            }
            sleep( 100 );
            exit( 0 );
        }

    }


    return 0;
}
